package gxdlxy.zx2202.animal;

/* 抽象类的定义规则：
* 1 包含抽象方法的类必须是抽象类
* 2 抽象类和抽象方法都要使用abstract修饰
* 3 抽象方法只需要声明，不需要实现，例如，第11行
* 4 如果一个类A继承了抽象类B，那么该子类A必须实现抽象类B全部的抽象方法
* */

public class Animal {
    void shout() {}; // 抽象方法的声明，不用实现
    public static void main(String[] args) {
        // 向上转型，安全合法
        Animal a = new Duck();
        a.shout();
        // 向下转型，存在漏洞，不安全
        Duck d = (Duck) new Animal();
        d.swim(); // 运行时会报错
    }
}
class Cat extends Animal{
    void shout() {
        System.out.println("喵");
    }
}
class Dog extends Animal{
    void shout() {
        System.out.println("汪");
    }
}
class Pig extends Animal{
    void shout() {
        System.out.println("哼");
    }
}
class Duck extends Animal{
    void shout() {
        System.out.println("嘎");
    }
    void swim() {
        System.out.println("鸭子游泳");
    }
}
class Monkey extends Animal{
    void shout() {
        System.out.println("父类为抽象类，必须实现父类的抽象方法");
    }
}
